#define streq(a, b) (strcmp((a), (b)) == 0)
-static char *kasprintf(const char *fmt, ...);
-
static struct notifier_block *xenstore_chain;
/* If something in array of ids matches this device, return it. */
return err;
if (strlen(frontend) == 0)
err = -ERANGE;
-
if (!err && !xenbus_exists(NULL, frontend, ""))
err = -ENOENT;
- if (err) {
- kfree(frontend);
+ kfree(frontend);
+
+ if (err)
return err;
- }
if (snprintf(bus_id, BUS_ID_SIZE,
"%.*s-%i-%s", typelen, type, domid, devid) >= BUS_ID_SIZE)
return 0;
}
+static int xenbus_hotplug_backend(struct device *dev, char **envp,
+ int num_envp, char *buffer, int buffer_size);
+static int xenbus_probe_backend(const char *type, const char *domid);
+static struct xen_bus_type xenbus_backend = {
+ .root = "backend",
+ .levels = 3, /* backend/type/<frontend>/<id> */
+ .get_bus_id = backend_bus_id,
+ .probe = xenbus_probe_backend,
+ .bus = {
+ .name = "xen-backend",
+ .match = xenbus_match,
+ .hotplug = xenbus_hotplug_backend,
+ },
+ .dev = {
+ .bus_id = "xen-backend",
+ },
+};
+
static int xenbus_hotplug_backend(struct device *dev, char **envp,
int num_envp, char *buffer, int buffer_size)
{
struct xenbus_device *xdev;
- struct xenbus_driver *drv = NULL;
+ struct xenbus_driver *drv;
int i = 0;
int length = 0;
- char *basepath_end;
- char *frontend_id;
DPRINTK("");
if (xdev == NULL)
return -ENODEV;
- if (dev->driver)
- drv = to_xenbus_driver(dev->driver);
-
/* stuff we want to pass to /sbin/hotplug */
add_hotplug_env_var(envp, num_envp, &i,
buffer, buffer_size, &length,
add_hotplug_env_var(envp, num_envp, &i,
buffer, buffer_size, &length,
- "XENBUS_BASE_PATH=%s", xdev->nodename);
-
- basepath_end = strrchr(envp[i - 1], '/');
- length -= strlen(basepath_end);
- *basepath_end = '\0';
- basepath_end = strrchr(envp[i - 1], '/');
- length -= strlen(basepath_end);
- *basepath_end = '\0';
-
- basepath_end++;
- frontend_id = kmalloc(strlen(basepath_end) + 1, GFP_KERNEL);
- strcpy(frontend_id, basepath_end);
- add_hotplug_env_var(envp, num_envp, &i,
- buffer, buffer_size, &length,
- "XENBUS_FRONTEND_ID=%s", frontend_id);
- kfree(frontend_id);
+ "XENBUS_BASE_PATH=%s", xenbus_backend.root);
/* terminate, set to next free slot, shrink available space */
envp[i] = NULL;
buffer = &buffer[length];
buffer_size -= length;
- if (drv && drv->hotplug)
- return drv->hotplug(xdev, envp, num_envp, buffer,
- buffer_size);
+ if (dev->driver) {
+ drv = to_xenbus_driver(dev->driver);
+ if (drv && drv->hotplug)
+ return drv->hotplug(xdev, envp, num_envp, buffer,
+ buffer_size);
+ }
return 0;
}
-static int xenbus_probe_backend(const char *type, const char *domid);
-static struct xen_bus_type xenbus_backend = {
- .root = "backend",
- .levels = 3, /* backend/type/<frontend>/<id> */
- .get_bus_id = backend_bus_id,
- .probe = xenbus_probe_backend,
- .bus = {
- .name = "xen-backend",
- .match = xenbus_match,
- .hotplug = xenbus_hotplug_backend,
- },
- .dev = {
- .bus_id = "xen-backend",
- },
-};
-
-
static void otherend_changed(struct xenbus_watch *watch,
const char **vec, unsigned int len)
{
fi
done
- for dom in $(xenstore-list "$XENBUS_BASE_PATH")
+ local base_path="$XENBUS_BASE_PATH/$XENBUS_TYPE"
+ for dom in $(xenstore-list "$base_path")
do
- for dev in $(xenstore-list "$XENBUS_BASE_PATH/$dom")
+ for dev in $(xenstore-list "$base_path/$dom")
do
- d=$(xenstore_read_default \
- "$XENBUS_BASE_PATH/$dom/$dev/physical-device" "")
+ d=$(xenstore_read_default "$base_path/$dom/$dev/physical-device" "")
if [ "$d" == "$devmm" ]
then
return
fi
else
- local m=$(xenstore_read "$XENBUS_BASE_PATH/$dom/$dev/mode")
+ local m=$(xenstore_read "$base_path/$dom/$dev/mode")
m=$(canonicalise_mode "$m")
if [ "$m" == 'w' ]
same_vm()
{
- local thisdom="$XENBUS_FRONTEND_ID"
local otherdom="$1"
- local thisvm=$(xenstore-read "/local/domain/$thisdom/vm")
local othervm=$(xenstore-read "/local/domain/$otherdom/vm")
- [ "$thisvm" == "$othervm" ]
+ [ "$FRONTEND_UUID" == "$othervm" ]
}
case $t in
phy)
dev=$(expand_dev $p)
+ FRONTEND_ID=$(xenstore_read "$XENBUS_PATH/frontend-id")
+ FRONTEND_UUID=$(xenstore_read_default \
+ "/local/domain/$FRONTEND_ID/vm" 'unknown')
claim_lock "block"
check_device_sharing "$dev" "$mode"
write_dev "$dev"